# 前言
上一章学习了如何将 GitLab Api 封装成工具类作为后期业务开发的基础。
除了 GitLab 工具类之外,实际开发中还会需要一些额外的工具类辅助开发,可以预先将这些工具类封装好,业务开发的时候效率更高。
本章会介绍其他的一些全局与工具类的开发与使用。
# 封装基础 Controller
上一章中,用户的业务 Controller 是继承了 BaseController 而不是直接继承 Egg 的 Controller,这是因为使用了运用继承的原理,对 Controller 做一层基础的封装,内置一些常用的功能,比如获取用户信息、全局返回参数等。
import { Controller } from "egg";
export default class BaseController extends Controller {
get user() {
return this.ctx.user;
}
success(data) {
this.ctx.body = {
code: 0,
data,
};
}
error({ code, data, message }) {
// 根据业务返回不同的错误 code,提供给前端做业务判断处理
this.ctx.body = {
code,
data,
message,
};
}
}
@前端进阶之旅: 代码已经复制到剪贴板
定义全局返回参数基础类之后,业务 Controller 继承基础类,业务类可以根据条件判断使用 success 或 error 方法,前端可以根据返回的 code 值进行业务判断。如果项目中还需要其他的额外处理,可以继续添加或者创建多个基础类。合理利用继承的优势,可以提高代码质量。
# 添加全局报错拦截
没有绝对安全的程序,所有程序在运行中可能因各种情况会出现异常,但有些情况并不需要将所有的报错内容直接抛给前端,展示给用户,所以全局错误回调是基础模块必要的。
全局错误拦截常用两种方式:
# 框架内置异常处理
Egg 框架自带的 onerror 插件支持自定义配置错误处理方法,可以覆盖默认的错误处理方法,需要的话可以根据实际业务重写。
// config/config.default.js
module.exports = {
onerror: {
all(err, ctx) {
// 在此处定义针对所有响应类型的错误处理方法
// 注意,定义了 config.all 之后,其他错误处理方法不会再生效
ctx.body = 'error';
ctx.status = 500;
},
html(err, ctx) {
// html hander
ctx.body = '<h3>error</h3>';
ctx.status = 500;
},
json(err, ctx) {
// json hander
ctx.body = { message: 'error' };
ctx.status = 500;
},
},
};
